package com.xyf.blog.handler;

import org.slf4j.ILoggerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
//不配置该处理器就能访问到error是因为springmvc的视图解析功能，只要建立好error目录下的
//handler就是处理器的意思
//这个注解会拦截所有注释为controller的类
@ControllerAdvice

public class ControllerExceptionHandler {
    //    获取日志对象
    private final Logger logger= LoggerFactory.getLogger(this.getClass());


    @ExceptionHandler(Exception.class)
//    这个注解是声名该方法可以进行异常处理，并且异常级别为exception

    public ModelAndView exceptionHandler(HttpServletRequest request,Exception e) throws Exception {
        //向日志中加东西
        logger.error("Request url:{}, Exception:{}",request.getRequestURI(),e );

//        这里是设置异常有自己定义的状态码的抛出这个类，让springboot去处理，没有就按自己设定的去处理
        if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) {
            throw e;
        }

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("url",request.getRequestURI());
        modelAndView.addObject("exception",e);

        //设置 modelAndView的返回页面
        modelAndView.setViewName("error/error");
        //这个返回值是页面加一些信息
        return modelAndView;
    }


}
